package com.mxw.leetcode.A5数组双指针;

import java.util.Arrays;

public class A01删除有序数组中的重复项 {

    /**
     * 给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
     * 输入：nums = [1,1,2]
     * 输出：2, nums = [1,2,_]
     * 解释：函数应该返回新的长度 2 ，并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
     */

    /**
     * 我们让慢指针 slow 走在后面，快指针 fast 走在前面探路，找到一个不重复的元素就赋值给 slow 并让 slow 前进一步。
     * <p>
     * s #         #                 #             #              #
     * f *      =>     *      =>         *  =>         *   =>            *  => s:1=> res:s+1=2
     * 1,1,2     1 , 1 , 2     1 , 1 , 2     1 , 2 , 2      1 , 2 , 2  2
     * <p>
     * 这样，就保证了 nums[0..slow] 都是无重复的元素，当 fast 指针遍历完整个数组 nums 后，nums[0..slow] 就是整个数组去重之后的结果。
     */
    static public int removeDuplicates(int[] nums) {

        // 快慢指针
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            // 前面的值不等于后面的值
            if (nums[fastIndex] != nums[slowIndex]) {
                //先移动慢指针，再替换旧值
                slowIndex++;
                nums[slowIndex] = nums[fastIndex];
            }
        }
        return slowIndex + 1;
    }

    public static void main(String[] args) {
        int[] arr = new int[]{1, 1, 1, 2, 3};
        removeDuplicates(arr);
        System.out.println(Arrays.toString(arr));
    }

}
